package com.example.baidu.location

import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.baidu.location.BDAbstractLocationListener
import com.baidu.location.BDLocation
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
import com.example.amap.lib.base.utils.LogUtil
import com.example.amap.location.bean.LocationInfo
import com.example.amap.location.observer.ILocationObserver
import com.example.amap.service.ILocationService
import com.example.baidu.ext.toLocationInfo

@Route(path = "/location/baidu/LocationServiceImpl")
class LocationServiceImpl : ILocationService, BDAbstractLocationListener() {
    companion object {
        private const val TAG = "LocationServiceImpl"
    }

    private var mLocationClient: LocationClient? = null

    private var mLocationInfo: LocationInfo? = null

    private val observers = mutableSetOf<ILocationObserver>()

    override fun init(context: Context?) {
        try {
            LocationClient.setAgreePrivacy(true)
            mLocationClient = LocationClient(context)
        } catch (exception: Exception) {
            LogUtil.e(TAG, "init mLocationClient", exception)
        }
    }

    override fun init() {
        mLocationClient?.apply {
            locOption = LocationClientOption().apply {
                //可选，设置定位模式，默认高精度
                locationMode = LocationClientOption.LocationMode.Hight_Accuracy
                //可选，设置返回经纬度坐标类型，默认gcj02
                coorType = "bd09ll"
                //可选，首次定位时可以选择定位的返回是准确性优先还是速度优先，默认为速度优先
                firstLocType = LocationClientOption.FirstLocType.SPEED_IN_FIRST_LOC
                //可选，设置发起定位请求的间隔，int类型，单位ms
                scanSpan = 1000
                //可选，设置是否使用卫星定位，默认false
                //使用高精度和仅用设备两种定位模式的，参数必须设置为true
                isOpenGnss = true
                //可选，设置是否当卫星定位有效时按照1S/1次频率输出卫星定位结果，默认false
                isLocationNotify = true
                //可选，定位SDK内部是一个service，并放到了独立进程。
                //设置是否在stop的时候杀死这个进程，默认（建议）不杀死，即setIgnoreKillProcess(true)
                isIgnoreKillProcess = false
                //可选，设置是否收集Crash信息，默认收集，即参数为false
                isIgnoreCacheException = false
                //可选，V7.2版本新增能力
                //如果设置了该接口，首次启动定位时，会先判断当前Wi-Fi是否超出有效期，若超出有效期，会先重新扫描Wi-Fi，然后定位
                wifiCacheTimeOut = 5 * 60 * 1000
                //可选，设置是否需要过滤卫星定位仿真结果，默认需要，即参数为false
                setEnableSimulateGnss(false)
                //可选，设置是否需要最新版本的地址信息。默认需要，即参数为true
                isNeedNewVersionRgc = true
                //可选，是否需要地址信息，默认为不需要，即参数为false
                setIsNeedAddress(true)
                //可选，设置是否需要最新版本的地址信息。默认需要，即参数为true
                isNeedNewVersionRgc = true
                //可选，是否需要位置描述信息，默认为不需要，即参数为false
                setIsNeedLocationDescribe(true)
            }
            registerLocationListener(this@LocationServiceImpl)
            start()
        }
    }

    override fun addLocationObserver(observer: ILocationObserver) {
        LogUtil.d(TAG, "addLocationObserver observer: $observer")
        observers.add(observer)
    }

    override fun removeLocationObserver(observer: ILocationObserver) {
        LogUtil.d(TAG, "removeLocationObserver observer: $observer")
        observers.remove(observer)
    }

    override fun onReceiveLocation(p0: BDLocation?) {
        mLocationInfo = p0?.toLocationInfo()
        observers.forEach { it.onLocationChanged(mLocationInfo) }
    }

    override fun getLocationInfo(): LocationInfo? = mLocationInfo
}